//
//  main.c
//  C_10进程与系统调用
//
//  Created by Robin on 16/3/20.
//  Copyright © 2016年 cnbm. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
//#include <time.h>
//#include <unistd.h>
#include <signal.h>
#include <errno.h>
//#include <sys/wait.h>
#include <string.h>

void error (char* msg){
    fprintf(stderr, "%s : %s\n",strerror(errno),msg);
}

void diediedie (int sig){
    printf("Good bye cruel world\n");

//    SIGPIPE       // 进程向一个没有人读的管道写数据
//    SIGTERM       // 有人要求内核终止进程
//    SIGWINCH      // 终端窗口大小改变
//    SIGSEGV       // 进程企图访问非法存储器地址
//    SIGTRAP       // 调试人员询问进程执行到了哪里
//    SIGFPE        //浮点错误
//    SIGQUIT       //有人要求停止进程,并把存储器中的内容保存到核心转存文件
//    SIGINT        //进程被终端
    
    exit(2);
}

int catch_sigal (int sig , void (*handle)(int)){
    struct sigaction action;
    action.sa_handler = handle;
    sigemptyset(&action.sa_mask);
    action.sa_flags = 0;
    
    return sigaction(sig, &action, NULL);
    //return action;
}

int main(int argc, char * argv[]) {
    
    if (catch_sigal(SIGINT, diediedie) == -1) {
        fprintf(stderr, "Cannot map the handler");
        exit(2);
    }
    
    //catch_sigal(SIGPIPE, SIG_DFL);  收到信号的默认处理
    //catch_sigal(SIGINT, SIG_IGN);     忽视某一个信号
    
    // 可以把定为几分之一秒后响铃 但很复杂需要setitimer() 函数 http://tinyurl.com/3o7hzbm
    char name[30];
    puts("Please input your name:");
    fgets(name, 30, stdin);
    printf("Hello %s\n",name);
    
    return 0;
}
